Home Posts About

Emacs 中使用 dired 替代系统文件管理器 Finder

Table of Contents

知乎上有很多的人吐嘈 Mac 系统的文件管理器 Finder 很难用,我个人也不喜欢使用 Finder,是能不用就不用。

Finder 会在文件夹中自动创建 .DSStore 文件,而且没法关闭。这个行为简直不能忍受。我会使用下面的命令来删除此文件。

find . -name ".DS_Store" -print -delete

大部份情况下我使用 Emacs 中的 Dired 管理文件。下面简单说说使用体验。文件管理器的主要作用就是增删改查,而使用 Emacs 管理文件及文件夹的实践,简洁且高效。

1.

文件中的增可以是新建文件夹或者新建一个文件。在 Finder 中不支持创建指定格式的文件,如 docx,Win 中可以直接右键创建。这两者也就是个使用习惯的问题,毕竟创建了空白的文件还是需要打开对应的软件来进行编辑,相反如果先打开软件则可以创建带模板的新文件。

在 Emacs 中使用 Dired 可以使用 +(dired-create-directory)号来创建新的文件夹,使用 dired-create-empty-file 来创建空白的纯文本的文件如 .md .org .py 等等,富文本的文件还是需要打开相应的软件创建。 dired-create-empty-file 这个命令没有快捷键,是因为可以使用 find-file 来代替,我平常使用都是 gf(find-file-at-point)然后输入文件名及后缀来新建及打开文件,接着编辑就可以。

增加也可能是从其他的文件夹中复制或移动文件到当前文件夹当中。在 Finder 或 Explorer 中需要先进入到源文件夹当中选择需要复制或移动的文件,然后打开目标文件夹,粘贴文件。Finder 和 Win11 中的 Explorer 支持文件夹的标签页管理。

在 Emacs 中我会开两个并列的 Buffer,左边是 source 文件夹,右边是 target 文件夹。在 source 文件夹中,使用 m(dired-mark) 标记欲复制或移动的文件,然后使用 C(dired-do-copy)复制文件或使用 R(dired-do-rename)来移动文件。

对于欲复制的文件或者文件夹怎么选取呢?数量比较少可以使用 m 标记文件,移动到下一个文件继续标记,直到标记完所有的文件。对于具有一定模式的文件,比如文件名都有 foo ,可以使用 %m 然后输入 foo 来标记文件名含有 foo 的文件。

% &		dired-flag-garbage-files
% C		dired-do-copy-regexp # 复制符合正则的文件
% H		dired-do-hardlink-regexp
% R		dired-do-rename-regexp # 重命名符合正则的文件
% S		dired-do-symlink-regexp
% Y		dired-do-relsymlink-regexp
% d		dired-flag-files-regexp
% g		dired-mark-files-containing-regexp # 标记文件内容中符合正则表达式的文件,纯文本文件
% l		dired-downcase #文件名最小化,英文文件名
% m		dired-mark-files-regexp
% r		dired-do-rename-regexp
% u		dired-upcase    # 文件名最大化,英文文件名

其他的支持的如上,如通过正则标记文件,或者通过检索内容来标记文件,都是一些比较方便的技巧。不一定会用的上,但是知道了,用上的时候就很方便。我使用 Emacs 来管理我的笔记,我对于笔记的要求就是纯文本,不喜欢富文本也不推荐使用他们来管理笔记文件。

2.

对于删除文件,同样的可以先标记(m)欲删除的文件,然后使用 D(dired-do-delete)来删除文件,也可以直接使用 D 来标记,然后使用 X 执行删除文件操作。先标记再删除就可以使用上一节中标记文件的方法进行。

3.

对于单一的文件改名,可以直接使用 R 进行。如果只开一个 buffer 那么修改后的文件依然处于当前文件夹中,如果开两个并列的 buffer 那么修改后的文件会从源文件夹中移动到目标文件夹中,源文件夹中的文件依然会被保留。这个行为就是复制文件夹到其他文件夹中并修改文件名的操作。

对于需要批量修改文件名,比如在文件名的最前面加上一个日期,可以使用 C-x C-q 开启 wdired-mode, 然后使用列编辑在文件名的前方加上统一的日期。而不需要一个个的去修改文件。这个模式修改文件名在 win 中使用 powertoy 也可以实现。

4.

我认为需要查找的文件或者文件夹是会需要一定的上下文的。没有上下文的文件,时间久了之后就会被遗忘,成为信息的孤岛。当前我使用 org-attach 管理文件,上下文信息使用 org-roam 进行。

org-roam 是 zettelkasten 笔记法在 Emacs 中的实现,类似于 roam 和 obsidian。

我目前使用 org-roam 进行项目的管理,当我收到一个文件或者需要创建项目相关的事项,会在 org-roam 中创建一个新的节点,然后使用 org-attach 来保存文件。在 org-roam 中的节点下我会保留一些相关的笔记,这样这可以基于上下文来查找特定的文件。

当没有相关的上下文或者直接想要搜索相关的文件时,就需要进行模糊搜索。我使用 SPC s f (consult-find) 来查找文件名,或者 C-u SPC s f 来指定需要查找指定的文件夹下的内容。

5. 其他

5.1. 文件打开与编辑

当使用 dired 打开了某个文件夹,对于纯文本文件(org/md/txt/tex等等),直接回车使用 Emacs 进行编辑。对于富文本文件(docx/ppt/excel),回车会默认解压此类文件,可以使用 W (browse-url-of-dired-file)来使用系统默认的软件打开文件。

5.2. 文件预览

Finder 有个很好用的功能是在某些文件上按空格可以直接使用 preview 对文件进行预览。Emacs 中可以使用 dirvish 替代 dired 使用,我是使用 p(dired-preview) 调用 Mac 系统中的 qlmanage 来进行预览。

(defun dired-preview ()
  "Quick look the current file in macOS."
  (interactive)
  (let* ((file (dired-get-filename)))
    (if (eq system-type 'darwin)
        (call-process-shell-command (concat "qlmanage -p " (shell-quote-argument file)) nil nil)
      (message "Not supported on this platform."))))

5.3. 使用系统文件管理器打开文件夹

我是使用了李杀写的函数,xah-show-in-desktop,绑定到了按键 e 上。使用的时候按 e 就会使用在 Finder 中显示当前文件。

5.4. 文件跳转   ATTACH

对于纯文本文件,我会使用 C-x C-j (dired-jump) 来跳转到当前的文件夹中,也就是在 dired 中显示当前的文件。

对于使用 org-attach 管理的文件,其具有 ID 属性及 ATTACH 的 tag。在当前节点下使用 C-c C-a (org-attach) 然后按 f 就可以在 dired 中显示当前节点下的所有文件。

对于使用模糊搜索(consult-find)的文件,如果是纯文本文件,直接回车使用 Emacs 打开进行编辑,如果是富文本文件,使用 C-, (embark-act)然后按 x 使用系统默认软件打开。当需要使用 dired 显示文件则是按 j 跳转到 dired 中。在 dired 中的某个文件上按 C-'(my/org-attach-visit-headline-from-dired) 则可以跳转到与此文件相关的笔记条目中。

5.5. 标签管理常用文件夹

对于常用的文件夹,我使用 bookmark 进行管理,就类似于 Finder 中把常用的文件夹 pin 到左侧目录树中是类似的。

C-x r m(bookmark-set)来将当前文件或文件夹添加到 bookmark 当中。对于不再需要文件夹,使用 bookmark-delete 从标签中删除。使用时我会 C-x C-d 调用 consult-dir 来跳转到常用的文件夹当中,这个行为是当你处于任何位置都可以进行的操作。

5.6. 固定文件的跳转

在 Emacs 中对于固定的文件可以使用 register 进行,其类似于 bookmark。C-x f(jump-to-register),然后按对应的字母即可打开指定的文件。不再需要类似于系统的文件管理器一样,先打开某个文件夹,再打开某个文件夹。

6. 注意

以上我只是写了我怎么使用 dired 管理我的文件及文件夹,但是没有给出详细的步骤及过程。文本的内容很难完全的展示其便利性及高效性,视频展示会是一个比较好的方式,但是目前没有这方面的计划。

当你需要某方面的功能,可以直接查看 dired 的手册。

org-attach 是另一个话题了,有时间再写我怎么使用 org-attach 管理我的文件的。


Created with Emacs 29.1.50 (Org mode 9.6.8) on MacOS Updated: 2023-05-25 Thu 11:25